package midend.IR_Value;

import midend.IR_Instruction.Phi_Instruction;
import midend.IR_Type.IR_Type;
import midend.Use;
import midend.User;

import java.util.ArrayList;
import java.util.HashSet;

//这个接口是方便读取变量的值的，同时存放类型和具体的值的
public abstract class IR_Value {
    public abstract String get_ValueName();/*返回的是当前变量需要写入IR中间代码的名字，包括了 % 和 @*/
    public abstract IR_Type get_Type();/*返回该值的类型*/
    public abstract int get_Const_Type();

    private ArrayList<Use> useList = new ArrayList<>();  // value值得引用链

    public void addUse(Use use) {
        this.useList.add(use);
    }

    public void replaceUse(IR_Value value) {
        for (Use use : useList) {
            User user = use.getUser();
            int pos = user.getUserValueList().indexOf(this);
            user.updateop(pos,value);
            user.setValue(pos, value);
        }
        this.useList.clear();
    }

    public void removeUserFromUse(User user) {
        ArrayList<Use> temp = new ArrayList<>(useList);
        for (Use use : useList) {
            if (use.getUser().equals(user)) {
                temp.remove(use);
            }
        }
        this.useList = temp;
    }

    public ArrayList<Use> getUseList() {
        return useList;
    }

    public ArrayList<User> getUserList() {
        ArrayList<User> users = new ArrayList<>();
        HashSet<User> visited = new HashSet<>();
        for (Use use : useList) {
            User user = use.getUser();
            if (!visited.contains(user)) {
                users.add(user);
                visited.add(user);
            }
        }
        return users;
    }

}
